package org.samples.filterchain;

import java.util.Arrays;
import java.util.List;

/**
 * 过滤器-责任链
 */
public class FilterChain {

    private final List<Filter> filters = Arrays.asList(new FilterA(), new FilterB());
    private int pos = 0;

    void doFilter() {
        // 逻辑：
        // 所有的Filter在内部会调用 FilterChain.doFilter，以完成责任链，并在前后执行start,end任务
        // 那么对于外层的调用顺序即，当为数组内（post < filters.size）时，按顺序执行start任务
        // 最后一个元素执行完成后调用的FilterChain.doFilter 不符合 post < filter.size()，则会执行 End chain逻辑
        if (pos < filters.size()) {
            Filter filter = filters.get(pos++);
            filter.doFilter(this);
            // 这里是只会执行一次servlet的关键
            return;
        }

        // 最后一个元素调用FilterChain.doFilter时进入的逻辑
        System.out.println("End chain, do servlet");

        // 方法栈开始倒推，最后一个元素调用FilterChain.doFilter，开始执行end任务，返回上一个Filter
        // 上一个的FilterChain.doFilter完成，开始执行end任务，完成后返回该Filter的上一个
        // 以此类推
    }
}
